package czolgisci.tiles.factory;

import java.awt.Point;
import java.io.IOException;
import java.util.HashMap;

import czolgisci.tiles.AMovableTile;
import czolgisci.tiles.ATile;
import czolgisci.tiles.Explosion;
import czolgisci.tiles.Tank;
import czolgisci.tiles.Bullet;
import czolgisci.tiles.TileType;
import czolgisci.tiles.Wall;

/**
 * Podstawowa fabryka kafelków.
 * 
 * @author pillow, kasztan
 * @version 1.0
 */
public class StandardTileFactory implements ITileFactory
{
	private static StandardTileFactory instance = null;
	final int TILE_WIDTH = 30;
	final int TILE_HEIGHT = 30;

	private static HashMap<TileType, String> images;
	static
	{
		//ścieżki do plikół graficznych wszystkich rodzajów kafelków
		images = new HashMap<TileType, String>();
		images.put(TileType.BULLET, "res/img/standard/bullet.png");
		images.put(TileType.TANK, "res/img/standard/tank.png");
		images.put(TileType.WALL, "res/img/standard/wall.png");
		images.put(TileType.EXPLOSION, "res/img/standard/explosion.png");
	}

	/**
	 * Prywatny konstruktor
	 */
	private StandardTileFactory()
	{
	}	
	
	/**
	 * metoda wzorca Singleton
	 * @return jedyna instancja klasy
	 */
	public static StandardTileFactory getInstance()
	{
		if(instance == null)
			instance = new StandardTileFactory();
		return instance;
	}

	/**
	 * Tworzy obiekt zadanego typu
	 * @param type typ obiektu do utworzenia (np. TileType.TANK)
	 * @param position pozycja obiektu na mapie
	 * @return
	 * @throws IOException 
	 */
	public ATile makeTile(TileType type, Point position) throws IOException, IllegalArgumentException
	{		
		switch (type)
		{
			case BULLET:
				return makeBullet(images.get(type), position);
			case TANK:
				return makeTank(images.get(type), position);
			case WALL:
				return makeWall(images.get(type), position);
			case EXPLOSION:
				return makeExplosion(images.get(type), position);
			default:
				throw new IllegalArgumentException();
		}
	}

	public int getTileWidth()
	{
		return TILE_WIDTH;
	}

	public int getTileHeight()
	{
		return TILE_HEIGHT;
	}
	
	/**
	 * Tworzy czołg
	 * @param position pozycja czolgu na mapie
	 * @return nowy czołg
	 * @throws IOException 
	 */
	private AMovableTile makeTank(String imagePath, Point position) throws IOException
	{
		return new Tank(imagePath, position);
	}
	
	/**
	 * Tworzy nabój
	 * @param position pozycja naboju na mapie
	 * @return nowy nabój
	 * @throws IOException 
	 */
	private AMovableTile makeBullet(String imagePath, Point position) throws IOException
	{
		return new Bullet(imagePath, position);
	}

	/**
	 * Tworzy fragment ściany
	 * @param position pozycja sciany na mapie
	 * @return fragment nowej ściany
	 * @throws IOException 
	 * @see czolgisci.tiles.factory.ITileFactory#makeWall()
	 */
	private ATile makeWall(String imagePath, Point position) throws IOException
	{
		return new Wall(imagePath, position);
	}
	
	/**
	 * Tworzy eksplozję
	 * @param position pozycja eksplozji na mapie
	 * @return eksplozja
	 * @throws IOException 
	 * @see czolgisci.tiles.factory.ITileFactory#makeWall()
	 */
	private ATile makeExplosion(String imagePath, Point position) throws IOException
	{
		return new Explosion(imagePath, position);
	}
}